package com.hxk.aop;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

/**
 * aop:面向切面编程
 *  是指在纵向程序执行的过程中，插入一个横向的切面，干一些额外的事情，但并不影响原始方法
 *  实现AOP的过程：
 *      1、导入spring-aspects的jar包
 *      2、定义一个业务类（Calcu）
 *      3、编写一个AOP切面类（CalcuAspectsLogs），必须使用@Aspect注解标注该类，让spring知道该类是一个切面类，
 *          需求：切面类要动态感知业务类Calcu的方法div调用，要在调用该方法前，方法后，方法正常执行完毕，方法异常执行时做出相应的业务处理
 *          Aop的通知方法有：
 *              切入点：@Pointcut 配置一个切入点
 *              前置通知：@Before
 *              后置通知：@After
 *              返回通知：@AfterReturning
 *              异常通知：@AfterException
 *              环绕通知：@Around
 *      4、将业务类和AOP切面类加入到ioc容器中
 *      5、使用@EnableAspectJAutoProxy 开启AOP功能
 *  最终运行结果：
 *      正常执行：前置通知-》目标方法-》后置通知-》返回通知
 * 	    出现异常：前置通知-》目标方法-》后置通知-》异常通知
 */
@EnableAspectJAutoProxy //开启aop功能
@Configuration
public class MainConfigAop {

    @Bean
    public Calcu calcu(){
        return new Calcu();
    }

    @Bean
    public CalcuAspectsLogs calcuAspectsLogs(){
        return new CalcuAspectsLogs();
    }
}
